// 以下所有的普通代码都是通过 node 主执行线程执行的

var fs = require('fs')

var foo = 'bar'
console.log(foo)

// 代码执行到这里，不执行，直接扔到事件队列中
setTimeout(function () {
  console.log('100 setTimeout')
}, 100)

// 一定不要在 Node 中写有大量计算的代码
// setTimeout(function () {
//   for (var i = 0; i < 10000000000; i++) {

//   }
// }, 0)

// 代码执行到这里，不执行，直接扔到事件队列中
fs.readFile('./接口文档.md', 'utf8', function (err, data) {
  if (err) {
    throw err
  }
  console.log('第一次读取到接口文档了')
  fs.readFile('./接口文档.md', 'utf8', function (err, data) {
    if (err) {
      throw err
    }
    console.log('第二次读取到接口文档了')
  })
})

fs.readFile()
fs.readFile()

// 继续到这里，直接执行
for (var i = 0; i < 10; i++) {
  console.log(i)
}

// 直接执行
// 
console.log('end')

// 直到上面的所有的普通代码执行结束了
// Node 主线程开始开启一个循环
// 循环中去不断的提取事件队列中的任务（就是上面所有代码添加的任务）
// 提取到任务之后：
//  Node 会判断一下，这个任务是否是需要进行 IO 的（文件读写、网络读写）
//  注意：只有文件IO、网络IO、定时器 才会进入事件队列
//  如果是定时器，则在循环线程上判断时间到没到，如果到了，直接执行，如果不到，再次扔到事件队列中
//  如果是IO类型的API：直接去线程池中找一个可用的线程
//
